﻿
using System;
using System.Data.SqlClient;
using System.Globalization;
using System.Runtime.Serialization;
using ProtoBuf;/*https://github.com/ServiceStack/ServiceStack/tree/master/lib*/
using ServiceStack.Text;/*https://github.com/ServiceStack/ServiceStack.Text*/
using V82;
using V82.ОбщиеОбъекты;
using V82.СправочникиСсылка;
using V82.СправочникиОбъект;
using V82.ДокументыСсылка;
using V82.Перечисления;//Ссылка;
namespace V82.СправочникиОбъект
{
	[ProtoContract]
	[DataContract]
	public partial class КомпетенцииРаботников:СправочникОбъект
	{
		public bool _ЭтоНовый;
		public bool ЭтоНовый()
		{
			return _ЭтоНовый;
		}
		[DataMember]
		[ProtoMember(1)]
		public Guid Ссылка {get;set;}
		[DataMember]
		[ProtoMember(2)]
		public long Версия {get;set;}
		[DataMember]
		[ProtoMember(3)]
		public string ВерсияДанных {get;set;}
		/*static хэш сумма состава и порядка реквизитов*/
		/*версия класса восстановленного из пакета*/
		[DataMember]
		[ProtoMember(4)]
		public bool ПометкаУдаления {get;set;}
		[DataMember]
		[ProtoMember(5)]
		public bool Предопределенный {get;set;}
		[DataMember]
		[ProtoMember(6)]
		public V82.СправочникиСсылка.КомпетенцииРаботников Родитель {get;set;}
		[DataMember]
		[ProtoMember(7)]
		public bool ЭтоГруппа {get;set;}
		[DataMember]
		[ProtoMember(8)]
		public string/*100*/ Наименование {get;set;}
		[DataMember]
		[ProtoMember(9)]
		public string/*(0)*/ ОписаниеКомпетенции {get;set;}//Описание компетенции
		[DataMember]
		[ProtoMember(10)]
		public V82.СправочникиСсылка.ШкалыОценокКомпетенций ШкалаОценок {get;set;}//Шкала оценок
		[DataMember]
		[ProtoMember(11)]
		public V82.СправочникиСсылка.ТиповыеАнкеты ТиповаяАнкета {get;set;}//Типовая анкета
		public void Записать()
		{
			//Установка блокировки элемента на горизантально масштабированный кластер.
			//Опционально введение тайм аута на запись одного и того же объекта, не чаще раза в 5-секунд. Защита от спама. упращение алгоритма блокировки.
			//Выделение сервиса для блокировки элемента и генерации кода
			//Выполнение операций контроля без обращений к sql-серверу.
			//Контроль конфликта блокировок.
			//Контроль загрузки булкинсертом гетерогенной коллекции.
			//Контроль уникальности кода для справочников.
			//Контроль уникальности номера для документов, в границах префикса.
			//Контроль владельца, он не может быть группой.
			//Контроль владельца он должен быть задан.
			//Контроль родителя он должен быть группой.
			//Контроль количества уровней, должен соотвествовать метаданным.
			//Контроль версии, объект не должен был быть записан перед чтением текущей записи, алгоритм версионника.
			//Контроль уникальности ссылки
			//Контроль зацикливания
			//Опционально контроль битых ссылок.
			//Соблюдейние транзакционности. ПередЗаписью. Открытие транзации. Валидации. ПриЗаписи. Фиксация транзакции. Информирование о записи элемента.
			using (var Подключение = new SqlConnection(СтрокаСоединения))
			{
				Подключение.Open();
				using (var Команда = Подключение.CreateCommand())
				{
					if(_ЭтоНовый)
					{
						Команда.CommandText = @"
						Insert Into _Reference75(
						_IDRRef
						/*,_Version*/
						,_Marked
						,_IsMetadata
						,_ParentIDRRef
						,_Folder
						,_Description
						,_Fld1221
						,_Fld1222RRef
						,_Fld1223RRef)
						Values(
						@Ссылка
						/*,@Версия*/
						,@ПометкаУдаления
						,@Предопределенный
						,@Родитель
						,@ЭтоГруппа
						,@Наименование
						,@ОписаниеКомпетенции
						,@ШкалаОценок
						,@ТиповаяАнкета)";
					}
					else
					{
						Команда.CommandText = @"
						Update _Reference75
						Set
						/*_IDRRef	= @Ссылка*/
						/*,_Version	= @Версия*/
						_Marked	= @ПометкаУдаления
						,_IsMetadata	= @Предопределенный
						,_ParentIDRRef	= @Родитель
						,_Folder	= @ЭтоГруппа
						,_Description	= @Наименование
						,_Fld1221	= @ОписаниеКомпетенции
						,_Fld1222RRef	= @ШкалаОценок
						,_Fld1223RRef	= @ТиповаяАнкета
						Where _IDRRef = @Ссылка";
					}
					Команда.Parameters.AddWithValue("Ссылка", Ссылка.ToByteArray());
					/*Команда.Parameters.AddWithValue("Версия", Версия);*/
					Команда.Parameters.AddWithValue("ПометкаУдаления", ПометкаУдаления);
					Команда.Parameters.AddWithValue("Предопределенный", Предопределенный);
					Команда.Parameters.AddWithValue("Родитель", Родитель);
					Команда.Parameters.AddWithValue("ЭтоГруппа", ЭтоГруппа?new byte[]{0}:new byte[]{1});
					Команда.Parameters.AddWithValue("Наименование", Наименование);
					Команда.Parameters.AddWithValue("ОписаниеКомпетенции", ОписаниеКомпетенции);
					Команда.Parameters.AddWithValue("ШкалаОценок", ШкалаОценок.Ссылка);
					Команда.Parameters.AddWithValue("ТиповаяАнкета", ТиповаяАнкета.Ссылка);
					Команда.ExecuteNonQuery();
				}
			}
		}
		public void Удалить()
		{
			using (var Подключение = new SqlConnection(СтрокаСоединения))
			{
				Подключение.Open();
				using (var Команда = Подключение.CreateCommand())
				{
					Команда.CommandText = @"Delete _Reference75
					Where _IDRRef=@Ссылка";
					Команда.Parameters.AddWithValue("Ссылка", Ссылка.ToByteArray());
					Команда.ExecuteNonQuery();
				}
			}
		}
		/*МодульОбъекта*/
		////////////////////////////////////////////////////////////////////////////////
		// ЭКСПОРТНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ
		// Процедура печати компетенции
		//
		// Параметры
		//  нет
		//

		public object Печать(/**/)
		{
			//Линия = Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.Сплошная);
			//ТабДокумент = Новый ТабличныйДокумент;
			//ТабДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_Компетенции";
			//Макет = ПолучитьМакет("Макет");
			//ОбластьМакета = Макет.ПолучитьОбласть("Шапка_Заголовок");
			//ТабДокумент.Вывести(ОбластьМакета);
			//ОбластьТабДокумента = ТабДокумент.Область(ТабДокумент.ВысотаТаблицы,,ТабДокумент.ВысотаТаблицы,);
			//ОбластьТабДокумента.ЦветФона		= ЦветаСтиля.ФонГруппировкиВерхнегоУровня;
			//ОбластьТабДокумента.ГраницаСверху	= Линия;
			//ОбластьТабДокумента.ГраницаСнизу	= Линия;
			//ОбластьМакета = Макет.ПолучитьОбласть("Шапка_Компетенция");
			//ОбластьМакета.Параметры.Компетенция		= Наименование;
			//ТабДокумент.Вывести(ОбластьМакета);
			if(true/*Не ПустаяСтрока(ОписаниеКомпетенции)*/)
			{
				//ОбластьМакета = Макет.ПолучитьОбласть("Шапка_ОписаниеКомпетенции");
				//ОбластьМакета.Параметры.Описание	= ОписаниеКомпетенции;
				//ТабДокумент.Вывести(ОбластьМакета);
			}
			if(true/*Не ШкалаОценок.Пустая()*/)
			{
				//ОбластьМакета = Макет.ПолучитьОбласть("Шапка_Шкала");
				//ОбластьМакета.Параметры.Шкала		= ШкалаОценок.Наименование;
				//ТабДокумент.Вывести(ОбластьМакета);
				//ОбластьМакета = Макет.ПолучитьОбласть("Оценка_Заголовок");
				//ТабДокумент.Вывести(ОбластьМакета);
				//ОбластьТабДокумента = ТабДокумент.Область(ТабДокумент.ВысотаТаблицы,,ТабДокумент.ВысотаТаблицы,);
				//ОбластьТабДокумента.ЦветФона		= ЦветаСтиля.ФонГруппировкиВерхнегоУровня;
				//ОбластьТабДокумента.ГраницаСверху	= Линия;
				//ОбластьТабДокумента.ГраницаСнизу	= Линия;
				//ОбластьМакета = Макет.ПолучитьОбласть("Оценка_Данные");
				/*Запрос = Новый Запрос(
		"ВЫБРАТЬ
		|	КомпетенцииРаботниковОписаниеОценок.Оценка.Наименование КАК Оценка,
		|	КомпетенцииРаботниковОписаниеОценок.ОписаниеОценки КАК Описание
		|ИЗ
		|	Справочник.КомпетенцииРаботников.ОписаниеОценок КАК КомпетенцииРаботниковОписаниеОценок
		|
		|ГДЕ
		|	КомпетенцииРаботниковОписаниеОценок.Ссылка = &Ссылка И
		|	КомпетенцииРаботниковОписаниеОценок.Оценка <> &ПустаяОценка
		|
		|УПОРЯДОЧИТЬ ПО
		|	КомпетенцииРаботниковОписаниеОценок.НомерСтроки");*/
				//Запрос.УстановитьПараметр("Ссылка",Ссылка);
				//Запрос.УстановитьПараметр("ПустаяОценка",Справочники.СоставОценочныхШкалКомпетенций.ПустаяСсылка());
				//Выборка = Запрос.Выполнить().Выбрать();
				while(true/*Выборка.Следующий()*/)
				{
					//ОбластьМакета.Параметры.Заполнить(Выборка);
					//ТабДокумент.Вывести(ОбластьМакета);
				}
				//;;
			}
			return null;
		}
		// Печать()
		// Процедура создает список оценок для ввода к ним описаний.
		//
		// Параметры:
		//  Нет.
		//
		// Возвращаемое значение:
		//  Нет.
		//

		public void ЗаполнитьОценки(/**/)
		{
			/*Запрос = Новый Запрос(
	"ВЫБРАТЬ
	|	СоставОценочныхШкалКомпетенций.Ссылка,
	|	СоставОценочныхШкалКомпетенций.ПриоритетОценки КАК ПриоритетОценки
	|ИЗ
	|	Справочник.СоставОценочныхШкалКомпетенций КАК СоставОценочныхШкалКомпетенций
	|
	|ГДЕ
	|	СоставОценочныхШкалКомпетенций.Владелец = &Владелец
	|
	|УПОРЯДОЧИТЬ ПО
	|	ПриоритетОценки УБЫВ");*/
			//Запрос.УстановитьПараметр("Владелец",ШкалаОценок);
			//Выборка = Запрос.Выполнить().Выбрать();
			if(true/*Выборка.Количество() = 0*/)
			{
				//ТекстСообщения = "В шкале оценок: """+ ШкалаОценок.Наименование +""" не введен список наименований оценок";
				//Сообщить (ТекстСообщения);
			}
			if(true/*ОписаниеОценок.Количество() > 0*/)
			{
				/*// Перестройка шкалы оценок. 
*/
				/*// Найдем и удалим все строки таблицы, где не заполнено описание.
*/
				//МассивСтрок = ОписаниеОценок.НайтиСтроки(Новый Структура("ОписаниеОценки",""));
				/*// "Обнулим" оставшиеся строки.
*/
				//ТЗ = ОписаниеОценок.Выгрузить();
				//ТЗ.ЗаполнитьЗначения(0,"ПриоритетОценки");
				//ТЗ.ЗаполнитьЗначения(Справочники.ШкалыОценокКомпетенций.ПустаяСсылка(),"Оценка");
				//ОписаниеОценок.Загрузить(ТЗ);
			}
			/*// Добавляем оценки в список.
*/
			while(true/*Выборка.Следующий()*/)
			{
				//СтрокаТЧ = ОписаниеОценок.Добавить();
				//СтрокаТЧ.Оценка 		 = Выборка.Ссылка;
				//СтрокаТЧ.ПриоритетОценки = Выборка.ПриоритетОценки;
			}
			//;;
		}
		// ЗаполнитьОценки
	}
}